package br.com.rodolfo.timesheet.dao;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;


public class HibernateDAO {
	
	protected Session sessao = null;
	protected Transaction transacao = null;
	
	public final int INSERIR = 1;
	public final int ALTERAR = 2;
	public final int EXCLUIR = 3;
	
	@SuppressWarnings("null")
	public void executaTransacao(Object dados, int operacao){
		// M�todo gen�rico para persist�ncia do banco de dados
		
		try{
			Session HibernateUtil = null;
			//Abrindo a sess�o
			sessao = HibernateUtil.getSessionFactory().openSession();
			
			//Iniciando a transa��o
			transacao = sessao.beginTransaction();
			
			//Executando a transa��o no banco de dados
			switch(operacao){
				
			case INSERIR:
				sessao.save(dados);
				break;
			
			case ALTERAR:
				sessao.update(dados);
				break;
			
			case EXCLUIR:
				sessao.delete(dados);
				break;			
			}
			
			
			//Commitando a transa��o
			transacao.commit();
			
			//Obs.: O Hibernate faz o rollback automaticamente, caso a transa��o d� erro.
		}catch(HibernateException erro){
			System.out.println("Erro ao executar transa��o. \n Erro: " + erro.getMessage());
			throw new HibernateException(erro);
		}finally{
			try{
				sessao.close();
			}catch(Throwable erro){
				System.out.println("Erro no encerramento da sess�o");
			}
		}
		
	}
	
	@SuppressWarnings("null")
	public void salvar(Object dados){
		
		try{
			Session HibernateUtil = null;
			//Abrindo a sess�o
			sessao = HibernateUtil.getSessionFactory().openSession();
			
			//Iniciando a transa��o
			transacao = sessao.beginTransaction();
			
			//Gravando o objeto no banco de dados
			sessao.save(dados);
			
			//Commitando a transa��o
			transacao.commit();
			
			//Obs.: O Hibernate faz o rollback automaticamente, caso a transa��o d� erro.
		}catch(HibernateException erro){
			System.out.println("Erro no cadastro. \n Erro: " + erro.getMessage());
			throw new HibernateException(erro);
		}finally{
			try{
				sessao.close();
			}catch(Throwable erro){
				System.out.println("Erro no encerramento da sess�o");
			}
		}
		
	}
	
	

}
